package org.convallaria.system.biz.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.convallaria.infrastruct.db.entity.BaseEntity;

import java.io.Serial;
import java.time.LocalDateTime;

/**
 * 系统登录日志实体类
 * 
 * 功能特性：
 * - 支持用户登录行为记录
 * - 支持多租户数据隔离
 * - 支持软删除机制
 * - 支持乐观锁并发控制
 * - 支持数据审计追踪
 * - 支持登录状态管理
 * - 支持登录环境信息记录
 * 
 * 业务说明：
 * - 登录日志是系统安全审计的重要组成部分
 * - 记录用户的登录行为和环境信息
 * - 支持登录成功和失败状态记录
 * - 支持登录IP地址和地理位置记录
 * - 支持浏览器和操作系统信息记录
 * - 支持登录失败原因记录
 * 
 * 关联关系：
 * - 与用户表：多对一关系，通过user_name关联
 * - 与租户表：多对一关系，通过tenant_id关联
 * 
 * 数据约束：
 * - user_name：用户名，可以为空
 * - status：登录状态，0=成功，1=失败
 * - login_time：登录时间，可以为空
 * 
 * @author convallaria
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_login_log")
public class SysLoginLog extends BaseEntity {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 访问ID
     * 主键，自增长
     */
    @TableId("log_id")
    private Long logId;

    /**
     * 用户ID
     * 登录用户ID
     */
    @TableField("user_id")
    private Long userId;

    /**
     * 用户账号
     * 登录用户账号
     */
    @TableField("user_name")
    private String userName;

    /**
     * 登录IP地址
     * 用户登录时的IP地址
     */
    @TableField("ipaddr")
    private String ipaddr;

    /**
     * 登录地点
     * 根据IP地址解析的登录地点
     */
    @TableField("login_location")
    private String loginLocation;

    /**
     * 浏览器类型
     * 用户使用的浏览器类型
     */
    @TableField("browser")
    private String browser;

    /**
     * 操作系统
     * 用户使用的操作系统
     */
    @TableField("os")
    private String os;

    /**
     * 登录状态
     * 0=成功，1=失败
     */
    @TableField("status")
    private String status;

    /**
     * 提示消息
     * 登录结果提示消息
     */
    @TableField("msg")
    private String msg;

    /**
     * 访问时间
     * 用户登录的时间
     */
    @TableField("login_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime loginTime;

    /**
     * 租户ID
     * 多租户数据隔离标识
     */
    @TableField("tenant_id")
    private Long tenantId;
}
